﻿Public Class Casilla
    Private _contenido As TipoContenido
    Private ReadOnly _posicion As Point
    Private _barco As Barco
    Private _subParteBarco As Integer
    Private _disparada As Boolean
    Private _elementoUI As PictureBox

    Public Sub New (posicion As Point, contenido As TipoContenido)
        _contenido = contenido
        _disparada = False
        _posicion = posicion
    End Sub

    Public ReadOnly Property Posición As Point
        Get
            Return _posicion
        End Get
    End Property

    Public ReadOnly Property Contenido As TipoContenido
        Get
            Return _contenido
        End Get
    End Property

    Public ReadOnly Property HayBarco As Boolean
        Get
            Return Not _barco Is Nothing
        End Get
    End Property

    Public ReadOnly Property Barco As Barco
        Get
            Return _barco
        End Get
    End Property


    Public Sub AsignaBarco (ByVal b As Barco, ByVal parte As Integer)
        _barco = b
        _subParteBarco = parte
        _contenido = TipoContenido.Barco
    End Sub

    Public Overrides Function ToString() As String
        If Not _barco Is Nothing Then
            Return String.Format ("{0}{1}{2}", _barco.Orientación.ToString.Substring (0, 1), _barco.CasillasQueOcupa, SubParteBarco)
        Else
            Return "-"
        End If
    End Function

    Public ReadOnly Property Disparada As Boolean
        Get
            Return _disparada
        End Get
    End Property

    Public ReadOnly Property EsAcierto As Boolean
        Get
            Return _disparada And _contenido = TipoContenido.Barco
        End Get
    End Property

    Private ReadOnly Property Imagen As Image
        Get
            If _barco Is Nothing Then
                Return Nothing
            End If

            Return _barco.Imagen (SubParteBarco)
        End Get
    End Property

    Public ReadOnly Property EsElementoUI() As Boolean
        Get
            Return Not _elementoUI Is Nothing
        End Get
    End Property

    Public ReadOnly Property SubParteBarco As Integer
        Get
            Return _subParteBarco
        End Get
    End Property

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="pb"></param>
    ''' <returns>False si ya había sido asignado</returns>
    ''' <remarks></remarks>
    Public Sub AsociaElementoUI (ByVal pb As PictureBox)
        If Not _elementoUI Is Nothing Then Return
        Debug.Assert (_elementoUI Is Nothing, "Esta casilla ya ha sido asignada")
        _elementoUI = pb
        Return
    End Sub


    Public Sub Muestralo(pb As PictureBox)
        _elementoUI = pb
        If HayBarco Then
            AsignaImagen(Imagen)
        Else
            AsignaImagen(ImagenDeResources("agua"))
        End If
    End Sub

    Sub ActualizaImagen()
        AsignaImagen (Imagen)
    End Sub

    Private Sub AsignaImagen (i As Image)
        Debug.Assert (_elementoUI IsNot Nothing, "Debes proveer el objeto de interface antes")
        _elementoUI.BackgroundImageLayout = ImageLayout.Zoom
        _elementoUI.BackgroundImage = i
    End Sub

    'Public Sub Disparo()
    '    Debug.Assert(Not _disparada, "No se debería poder disparar dos veces sobre la misma casilla")
    '    Debug.Assert(_elementoUI IsNot Nothing, "Debes proveer el objeto de interface antes")
    '    _disparada = True

    '    If HayBarco Then
    '        _barco.Disparo(Me)
    '        AsignaImagen(Imagen)
    '    Else
    '        AsignaImagen(ImagenDeResources("agua"))
    '    End If
    'End Sub

    Public Sub DisparoEnAgua()
        Debug.Assert (Not _disparada, "No se debería poder disparar dos veces sobre la misma casilla")
        Debug.Assert (_elementoUI IsNot Nothing, "Debes proveer el objeto de interface antes")
        _disparada = True
        AsignaImagen (ImagenDeResources ("agua"))
    End Sub

    Sub DisparoEnBarco (b As Barco, subParte As Integer)
        Debug.Assert (Not _disparada, "No se debería poder disparar dos veces sobre la misma casilla")
        Debug.Assert (_elementoUI IsNot Nothing, "Debes proveer el objeto de interface antes")
        _disparada = True
        _barco = b
        _subParteBarco = subParte
        _barco.Disparo (Me)
        AsignaImagen (Imagen)
    End Sub
End Class